نزدیک به یک دهه است که شاهد استفاده از پردازندههای
چندهستهای بر روی رایانههای شخصی هستیم و امروزه این امر به مسئلهای
طبیعی تبدیل شده است. در ابتدای کار، استفاده از پردازندههای دو هستهای
مدنظر قرارگرفته بود اما بهتدریج استفاده از پردازندههای چهار هستهای
نیز متداول شد. امروزه شرکتهایی مانند اینتل و AMD از پردازندههای
پیشرفته مجهز به ۶ و یا حتی ۸ هسته استفاده میکنند.
به گزارش سافت گذر به نقل ازفارنت؛ پردازندههای گوشیهای هوشمند نیز تاریخچهای مشابه دارند.
پردازندههای دوهستهای با مصرف بهینه از طرف ARM چیزی نزدیک به پنج سال
پیش روانه بازار شدند و از آن موقع تا کنون شاهد حضور پردازندههای چهار،
شش و هشت هستهای بودهایم. با این اوصاف تفاوت بزرگی میان پردازندههای شش
و هشت هستهای دسکتاپ اینتل و AMD با پردازندههای شش و هشت هستهای
برپایه معماری ARM وجود دارد و اکثر پردازندههای برپایه ARM با بیش از
چهار هسته از حداقل دو طراحی متفاوت بهره میبرند.
اگرچه استثنائاتی نیز وجود دارند اما بهطور کلی یک پردازنده هشت
هستهای برپایه ARM از سیستمی بهنام چند پردازشی ناهمگون یا همان HMP بهره
میبرد. این بهمعنای آن است که همه هستهها یکسان (همگون) نیستند. در
پردازندههای جدید ۶۴ بیتی این بدانمعناست که از هستههای Cortex-A57 یا
Cortex-A72 در کنار هسته Cortex-A53 بهره برده شده است. A72 هسته با عملکرد
بالا بوده اما A53 مصرف انرژی بهینهتری دارد. از این ترکیب با عنوان
بزرگ-کوچک یاد میشود که در آن هستههای Cortex-A72 به عنوان هستههای بزرگ
در ترکیب با هستههای Cortex-A53 بهعنوان هستههای کوچک قرار میگیرند.
این ترکیب کاملا متفاوت از آنچه پردازندههای شش یا هشت هستهای اینتل و
AMD به همراه دارند میباشد.![arm-cortex-chip-die](http://images.farnet.ir/2015/06/arm-cortex-chip-die-600x338.jpg)
هنگامی که پردازندههای چند هستهای برای اولین بار برای رایانههای
رومیزی عرضه شدند این پرسش بهوجود آمد که فواید پردازندههای دو هستهای
در مقایسه با نسخه تکهستهای کدامند؟ آیا پردازنده دو هستهای با فرکانس
۱.۶ گیگاهرتز بهتر از پردازنده تکهستهای با فرکانس کاری ۳.۲ گیگاهرتز
است؟ آیا ویندوز میتواند از پتانسیل کامل این پردازندهها بهره کامل را
ببرد؟ عملکرد بازیها بر روی پردازندههای تکهستهای بهتر است یا بر روی
پردازندههای دو هستهای؟ آیا نیاز به کدنویسی مجدد برنامهها بهمنظور
استفاده از این هستههای اضافی وجود دارد؟ اینها تنها بخشی از پرسشهای
ایجادشده هستند.
مبانی پردازش چندهستهای
پرسشهای یادشده میتوانند در خصوص پرداش چندهستهای در گوشیهای هوشمند
نیز مطرح شوند. پیش از بازکردن مسئله پردازش چندهستهای و ارتباط آن با
برنامههای اندرویدی بهتر است نگاهی کلی به این تکنولوژی داشته باشیم.
همانطور که میدانید رایانهها در اجرای یک وظیفه مشخص، عملکردی قابل
قبول دارند اما هنگامی که دو یا چند وظیفه به آنها محول میشود اوضاع کمی
متفاوت خواهد بود. در واقع در حالت چندوظیفهای زمان موجود برای پردازنده
میان وظایف مختلف تقسیم خواهد شد. قسمتی از زمان پردازنده به یک وظیفه یا
پروسه محول خواهد شد و قسمت بعد صرف پروسه بعدی خواهدشد و این روند به همین
منوال دنبال خواهدشد. در قلب سیستمعاملهایی مانند لینوکس، ویندوز، OS X و
اندروید تکنولوژی به نام برنامهریز وجود دارد. وظیفه این تکنولوژی آن است
که مشخص کند کدام پروسه یا وظیفه باید تکه بعدی زمان پردازنده را به خود
اختصاص دهد.
این تکنولوژی برنامه ریز ممکن است به طرق مختلف نوشته شود. در یک سرور،
این تکنولوژی بهگونهای مورد استفاده قرار میگیرد تا اولویت را به
ورودی/خروجیهای اجرای وظایفی مانند نوشتن بر روی دیسک و یا خواندن از شبکه
اختصاص دهد اما در رایانههای شخصی، برنامهریز بیشتر توان خود را بر روی
فعالنگهداشتن و پاسخگویی رابط کاربری گرافیکی معطوف خواهد کرد.![android_graphics_pipeline_surfaceflinger](http://images.farnet.ir/2015/06/android_graphics_pipeline_surfaceflinger-600x298.jpg)
هنگامی که بیش از یک هسته در دسترس باشد، برنامهریز میتواند به یک
پردازنده زمانی مشخص را بدهد و پروسه بعدی نیز به پردازنده بعدی محول
خواهدشد. بهاین ترتیب یک پردازنده دو هستهای بههمراه برنامهریز
میتواند امکان اجرای دو مورد بهطور همزمان را فراهم کند. در صورتیکه از
هستههای بیشتری استفاده کنید پروسههای بیشتری بهطور همزمان قابل اجرا
خواهند بود.
همانطور که عنوان گردید، برنامهریز، تکنولوژی ویژه برای تقسیم منابع
پردازنده میان وظایف و پروسههای مختلف مانند اجرای برنامههای پسزمینه،
اجرای مرورگر و موارد دیگر است اما آیا یک پروسه مشخص را میتوان میان
هستههای مختلف تقسیم کرد؟
برخی موارد بهطور طبیعی از توالی برخوردارند. بهعنوان مثل در صورتی که
قصد پخت کیک را داشته باشید ابتدا باید تعدادی تخممرغ را بشکنید، کمی آرد
به آن اضافه کنید و آنها را مخلوط و نهایتا در مرحله آخر آنرا در داخل
فر قرار دهید. نمیتوان ظرف کیک را از ابتدا در داخل فر قرارداد تا آماده
شود، بنابراین حتی در صورتی که از دو آشپز ماهر در آشپزخانه خود بهره
میبرید الزاما این ترکیب باعث صرفهجویی در وقت نخواهد شد اما میتوانید
یک آشپز را به آماده کردن کیک و دیگری را مشغول آمادهکردن سالاد کنید اما
وظایفی که ترتیب مشخصی دارند استفاده از پردازندههای دو هستهای و حتی ۱۲
هستهای هیچ سودی نخواهد داشت.
این در حالی است که همه وظایف موجود اینگونه نیستند. بهعنوان مثال
برخی از این وظایف را میتوان به چندین قسمت تقسیم کرد. در صورتی که از
الگوریتمی برای یافتن اعداد اول بهره میبرید، این الگوریتم هیچ وابستگی به
نتایج قبلی نخواهد داشت و میتوانید کار را به دو قسمت مجزا تقسیم کنید.
یک پروسه میتواند برای کنترل ۵۰ میلیون عدد و پروسه دیگر برای کنترل ۵۰
میلیون عدد بعدی بهکار گرفته شود. در صورتی که از پردازنده چهارهستهای
استفاده میکنید میتوانید این روند را به چهار قسمت تقسیم کنید. با توجه
به این موارد ممکن است نیاز به بازنویسی برنامه به روشی جدید داشته باشید.
بهعبارت دیگر برنامه باید بهگونهای طراحی شود تا کل کار به قسمتهای
مختلف تقسیم شود. روشهای برنامهنویسی متفاوتی بدین منظور وجود دارند.
شاید تاکنون اصطلاحاتی مانند Single-threaded و یا Multi-threaded را شنیده
باشد. این اصطلاحات مشخصکننده برنامههایی هستند که تنها برمبنای یک اجرا
کننده برنامه (Single threaded) و یا چندین اجراکننده مستقل (Threads)
آماده شدهاند که بهطور مستقل برنامهریزی کرده تا زمان را بر روی
پردازنده بدست آورند. بهطور مختصر برنامهای که با یک اجراکننده هماهنگی
داشته باشد از پردازنده چندهستهای هیچ سودی نخواهد برد.
تقریبا به طرح و عملکرد پردازندههای چندهستهای واقف شدیم و تنها یک
نکته دیگر باقی مانده است. بسته به اینکه سیستمعامل مورد استفاه ما چگونه
نوشته شده است، برخی از عملکردهایی که یک برنامه به اجرا میگذارد میتواند
بهطور طبیعی در حال چند قسمتی اجرا شود. این مورد یکی از جنبههای مهم در
سیستمعامل اندروید است.
یکی از وظایف در سطح سیستمی در معماری اندروید، SurfaceFlinger نام
دارد. این مولفه در واقع قسمت مرکزی ارسال گرافیک توسط اندروید به
صفحهنمایش است و در واقع وظیفه مجزایی است که باید بهمنظور در اختیار
قرارگرفتن قسمتی از زمان پردازنده برنامهریزی شود. در واقع این بدان
معناست که عملگرهای گرافیکی خاص به پروسه دیگری برای اجرا، پیش از کاملشدن
نیاز دارند.
اندروید
به علت وجود پروسههایی مانند SurfaceFlinger، اندروید بدون نیاز به
طراحی ویژه برنامهها از قابلیت چندهستهای بهره میبرد. از سوی دیگر با
توجه به اینکه موارد زیادی وجود دارند که در پسزمینه در حال رخداد هستند
که نمونههایی از آنها را میتوان همگامسازی دادهها و یا استفاده از
ویجتها عنوان کرد. سیستمعامل اندروید بهطور کلی از قابلیت پردازش
چندهستهای بهره میبرد. همانطور که انتظار دارید، سیستمعامل اندروید
توانایی ایجاد برنامههای چندسطحی را داراست. با این اوصاف سوال اصلی
همچنان بدون پاسخ باقی میماند. آیا اکثریت برنامههای اندرویدی از یک هسته
استفاده میکنند؟ در صورتی که پاسخ این سوال مثبت باشد در واقع هیچ تفاوتی
در عملکرد گوشی چندهستهای (چهار یا هشت هستهای) شما با گوشی دو هستهای
وجود نخواهد داشت.
باردیگر باید عنوان کرد که تفاوتی میان پردازندههای چهار و هشتهستهای
گوشیهای هوشمند با نمونههای مورد استفاده در رایانههای شخصی و سرورها
وجود دارد. اکثر پردازندههای هشتهستهای برپایه ARM در واقع تشکیلشده از
هستههای با کارایی بالا و هستههایی با توان مصرفی پایین و یا بهتر است
بگوییم بهینهشده هستند. ایده اصلی استفاده از این ترکیب آن است که
هستههای با مصرف بهینه توان برای انجام پروسههای معمول و سبک مورد
استفاده قرارگیرند و هستههای با کارایی بالا نیز مسئولیت اجرای پروسههای
سنگین را عهدهدار شوند. با این اوصاف کلیه هستهها میتوانند همانند آنچه
در رایانههای رومیزی شاهد هستیم بهطور همزمان مورد استفاده قرارگیرند.
مسئله اصلی آن است که پردازندههای هشتهستهای با تکنولوژی بزرگ- کوچک
بهمنظور نیل به مصرف بهینه انرژی و نه افزایش کارایی تولید شدهاند.
آزمایش
دریافت اطلاعات از سیستمعامل اندروید بهمنظور تشخیص میزان استفاده
برنامههای مختلف از هستههای پردازنده امکانپذیر میباشد. این اطلاعات در
مسیر /proc/stat file قرار میگیرند. بهواسطه استفاده از ابزاری خاص
میتوان اطلاعات مرتبط با استفاده از هر هسته را در هنگام اجرای برنامههای
مختلف بدست آورد. بهمنظور افزایش بازده و کاهش تاثیر بر عملکرد، این
اطلاعات تنها در مواقعی که برنامه تست در حال اجرا میباشد جمعآوری
میگردند و تحلیل دادههای جمعآوریشده نیز به صورت آفلاین انجام
میگیرد.
با استفاده از این ابزار که هنوز فاقد نام خاصی میباشد، برنامههای
متفاوتی از بازی و مرورگر وب بر روی یک گوشی هوشمند مجهز به پردازنده
چهارهستهای اسنپدراگون ۸۰۱ و گوشی دیگر مجهز به پردازنده هشت هستهای
اسنپ دارگون ۶۱۵ اجرا شدند. نهایتا نمودارهای مختلفی بدست آمدند.
در زیر میتوانید نموداری که نمایشدهنده نحوه استفاده از هستههای
مختلف در موقع اجرای مرورگر کروم بر روی پردازنده اسنپدارگون ۸۰۱ میباشد
را مشاهده کنید.
![procstat-chrome-quadcore-graphs-core-usage](http://images.farnet.ir/2015/06/procstat-chrome-quadcore-graphs-core-usage-600x325.jpg)
این نمودار نشان میدهد که چهتعدادی از هستهها توسط اندروید و مرورگر
وب مورد استفاده قرارگرفتهاند. این برنامه میزان استفاده از هستههای
مختلف را نشان نداده اما نشان میدهد که آیا هسته یادشده اصلا مورد استفاده
قرارگرفته یا خیر! آنچه مشخص است آن است که چهار هسته مورد استفاده قرار
میگیرند و این استفاده گهگاه به دو هسته تقلیل مییابد. در طول انجام این
آزمایش با کامل شدن لود یک صفحه به سراغ صفحهبعدی رفتیم و زمانی را صرف
خواندن صفحات نکردیم تا میزان استفاده از پردازنده به صفر نرسد.
در زیر میتوانید نموداری که نشاندهنده میزان استفاده از هر هسته است
را مشاهده میکنید.این نمودار تا حد زیادی با نتایج میانگین گرفته شده
بازسازی شده است. این بدان معنا است که بیشینههای استفاده از هستهها کمتر
از آنچه باید نشان داده شدهاند. بهعنوان مثال بیشینه مورد استفاده در
این نمودار فراتر از ۹۰ درصد میباشد اما اطلاعات خام نشان میدهد که برخی
از هستهها چندین و چندبار در طول تست به صد درصد مقدار میرسند.
![procstat-chrome-quadcore-graphs-active-cores](http://images.farnet.ir/2015/06/procstat-chrome-quadcore-graphs-active-cores-600x305.jpg)
اما در خصوص پردازندههای هشتهستهای وضعیت چگونه است؟ همانگونه که
مشاهده میکنید نمودار زیر نشان میدهد که هفت هسته بهطور دائم مورد
استفاده قرار میگیرند و به ندرت این مقدار به ۸ هسته میرسد و البته در
مواقعی این میزان به ۶ یا ۴ هسته کاهش مییابد. همانگونه که مشاهده
میکنید نمودار متعادلشده میزان استفاده، حاکی از آن است که برنامهریز با
توجه به بهرهگیری از پردازنده بزرگ-کوچک اسنپدارگون ۶۱۵ عملکردی کاملا
متفاوت دارد.
مشاهده میکنید که دو یا سه هسته وجود دارند که بیش از دیگران مورد
استفاده قرار میگیرند اما همه هستهها بهنوعی مورد استفاده
قرارگرفتهاند. آنچه مشاهده میشود عملکرد تکنولوژی بزرگ-کوچک در واگذاری
وظایف از یک هسته به دیگری بسته بر میزان بار است. مدنظر داشته باشید که
استفاده از تعداد هسته بیشتر بهمنظور افزایش بازدهی انرژی بوده و نه
کارایی بالاتر. با این اوصاف میتوان اذعان داشت این جمله که برنامههای
اندرویدی تنها از یک هسته استفاده میکنند اشتباه است. البته از آنجایی که
طراحی کروم برای اندروید در این زمینه مشابه طراحی انجامشده برای
رایانههای شخصی میباشد نباید انتظاری جز این داشت.
عملکرد برنامههای دیگر
جدا از کروم، مجبور به اجرای تستهای مشابه بر روی برنامههای دیگر بهمنظور تشخیص عملکرد آنها بودیم.
جیمیل: بر روی گوشیهای چهارهستهای میزان استفاده، میان دو و چهار
هسته تقسیم شد. با این اوصاف میزان استفاده از هستهها هیچگاه به بیش از
۵۰ درصد نرسید که این امر نشاندهنده سبکبودن برنامه یادشده است. بر روی
گوشیهای هوشمند هشت هستهای این تراکم کاری میان ۴ و هشت هسته تقسیم شد
اما متوسط استفاده از هستهها کمتر از ۳۵ درصد بود.
یوتیوب: بر روی گوشیهای چهارهستهای تنها دو هسته مورد استفاده
قرارگرفتند و میزان متوسط استفاده از هستهها نیز کمتر از ۵۰ درصد بود. بر
روی گوشیهای هشت هستهای، یوتیوب از ۴ هسته و بعضا در مقاطعی از ۶ و یا سه
هسته استفاده کرد. میزان متوسط استفاده از هستهها چیزی در حدود ۳۰ درصد
بود. با این اوصاف، برنامهریز لطف بزرگی به هستههای بزرگ کرده و هستههای
کوچک شدیدا مورد استفاده قرارگرفتند.
Riptide GP2: بر روی گوشی مجهز به پردازنده چهار هستهای کوالکام این
بازی اکثر مواقع از دو هسته استفاده کرد و دو هسته دیگر کمتر درگیر شدند.
بر روی گوشیهای هشت هستهای بین شش و هفت هسته مورد استفاده قرارگرفتند
اما بیشترین فشار بر روی سه هسته از مجموع این هستهها بود.
Templerun 2: بر روی یک گوشی هشت هستهای این گوشی از ۴ و ۵ هسته در
اکثر موارد استفاده میکرد و این مقدار نهایتا به هفت هسته رسید اما تنها
یک هسته حجم بیشتری از کارها را انجام میداد. بر روی دستگاه مجهز به
پردازنده چهارهستهای کوالکام اسنپ دراگون ۸۰۱، دو هسته بهطور مساوی به
تقسیم کار پرداختند و دو هسته نیز فشار کمی را تحمل کردند. بر روی گوشی
مجهز به پردازنده چهارهستهای مدیاتک نیز چهار هسته به تقسیم وظایف بهطور
یکسان پرداختند. این مسئله مشخصکننده تفاوت در برنامهریزی و تفاوت در
طراحی و نهایتا تاثیر آن بر میزان و نحوه استفاده از پردازنده میباشد.
یکی از موارد جالب را میتوان در استفاده از برنامه بنچمارک AnTuTu
مشاهده کرد. در استفاده از این برنامه، قسمت آخر تست بهطور کامل از کلیه
هستههای پردازنده استفاده میکند. واضح و آشکار است که بنچمارک بهطور
مصنوعی حجم زیادی از کارها را ایجاد میکند و با توجه به درگیربودن بیش از
حد هستهها در سرعت کامل، تراشههای مجهز به تعداد هسته بیشتر، نتایج بهتری
در اکثر قسمتها ثبت میکنند. لازم به ذکر است که چنین عملکردی در هیچ
برنامه دیگری ثبت نشد.![procstat-antutu-octacore-graphs](http://images.farnet.ir/2015/06/procstat-antutu-octacore-graphs-600x336.jpg)
چرا برنامههای سبک از هشت هسته استفاده میکنند؟
در صورتی که به نمودارهای برنامهای مانند جیمیل توجه کنید متوجه
واقعیتی جالب خواهید شد. بر روی گوشیهای مجهز به پردازنده چهارهستهای،
حجم کار میان ۲ و چهار هسته تقسیم میشود اما در گوشیهای مجهز به پردازنده
هشت هستهای این حجم کار میان چهار و هشت هسته تقسیم میشود. سوال اینجاست
که وقتی جیمیل در گوشیهای چهارهستهای بر روی دو و چهار هسته اجرا
میشود چه نیازی به حداقل چهار هسته در گوشیهای هشت هستهای خواهد داشت.
نکته اصلی در کارایی ترکیب بزرگ-کوچک پردازندهها نهفته است. در این
ترکیب هستهها یکسان نیستند. آنچه ما مشاهده میکنیم در واقع نحوه استفاده
برنامهریز از هستههای کوچک است و هنگامی که حجم پردازش افزایش مییابد
هستههای بزرگ نیز وارد عمل میشوند. پس از افزایش کار، هستههای کوچک
غیرفعال شده و مجددا با کاهش حجم پردازش، هستههای بزرگ غیرفعال و هستههای
کوچک فعال میشوند. البته این روند بسیار سریع و به تعداد هزاران بار در
هر ثانیه اتفاق میافتد.
همانطور که بر روی نمودار مشاهده میکنید در ابتدای امر تنها هستههای
کوچک مورد استفاده قرار میگیرند اما پس از گذشت چیزی در حدود ۱۲ ثانیه،
هستههای بزرگ وارد عمل میشوند. پس از گذشت حدود ۲۰ ثانیه فعالیت هستههای
بزرگ افزایش یافته و هستههای کوچک به حجم کاری در حدود صفر میرسند.
همانطور که مشاهده میکنید عملکرد پردازندههای بزرگ-کوچک برای
پردازندههای هشت هستهای مشابه آنچه در رایانههای شخصی مشاهده میکنیم
نیست و هستههای بیشتر به برنامهریز امکان انتخاب هستههای صحیح برای
انجام عمل را خواهند داد. نکته جالب اینکه در هیچ یک از برنامههای کاربردی
شاهد بهرهگیری صد درصدی از هر هشت هسته نبودیم.![procstat-epic-citadel-big-vs-little-octacore-graphs](http://images.farnet.ir/2015/06/procstat-epic-citadel-big-vs-little-octacore-graphs-600x326.jpg)
سخن آخر اینکه آنچه مشخص است برنامههای اندروید توانایی بهرهگیری از
چندین هسته پردازشی و البته ترکیبهای بزرگ-کوچک را دارا بوده و این ترکیب
به برنامهریز این امکان را خواهد داد تا بهترین ترکیب هستهها را برای
انجام کار مورد استفاده قراردهد.